package model

import (
	"go-web/initdb"
)

/*
	struct 方法中的传入 value or pointer
		1. struct 的方法中，需要修改 struct 的值的话，必须使用 pointer 指针
		2. 如果 struct 比价大的话，使用 pointer 可以提高效率
		3. 使用 value 的好处是，对于基本类型 slices, small structs 时，value 类型可以提高速率
*/

// Article 文章, 使用 struct tag 标注 json 解析对应的字段
// example 用户 swagger 中的默认展示
type Article struct {
	ID      int    `json:"id"`
	Type    string `json:"type" example:"js"`
	Content string `json:"content" example:"hello js"`
}

func init() {
	if !initdb.Db.HasTable(Article{}) {
		initdb.Db.CreateTable(Article{})
	}
}

// TableName 返回数据库对应的表名, 数据库默认对应 Model 的是 articles
func (article Article) TableName() string {
	return "article"
}

// Insert 添加文章
func (article Article) Insert() int {
	// 方式1： 通过 Db 实现
	// result, e := initdb.Db.Exec(
	// 	"insert into `article` (type, content) values(?,?);",
	// 	article.Type,
	// 	article.Content,
	// )

	// if e != nil {
	// 	log.Panicln("文章添加失败", e.Error())
	// }
	// i, _ := result.LastInsertId()

	// return int(i)

	create := initdb.Db.Create(&article)
	if create.Error != nil {
		return 0
	}
	return 1
}

// FindAll 查询所有 article
func (article Article) FindAll() []Article {
	// rows, e := initdb.Db.Query("select * from `article`;")

	// if e != nil {
	// 	log.Panicln("查询数据失败")
	// }

	// var articles []Article

	// for rows.Next() {
	// 	var a Article
	// 	if e := rows.Scan(&a.ID, &a.Type, &a.Content); e == nil {
	// 		articles = append(articles, a)
	// 	}
	// }

	// return articles
	var articles []Article
	initdb.Db.Find(&articles)
	return articles
}

// FindByID 根据 ID 查询文章
func (article Article) FindByID() Article {
	// row := initdb.Db.QueryRow("select * from `article` where id=?;", article.ID)

	// if e := row.Scan(&article.ID, &article.Type, &article.Content); e != nil {
	// 	log.Panic("绑定发生错误", e.Error())
	// }

	// return article
	initdb.Db.First(&article, article.ID)
	return article
}

// DeleteOne 删除
func (article Article) DeleteOne() {
	// if _, e := initdb.Db.Exec("delete from `article` where `id`=?;", article.ID); e != nil {
	// 	log.Panicln("数据发生错误，无法删除")
	// }
	initdb.Db.Delete(article)
}
